require( lme4 )
Loading required package: lme4
Loading required package: Matrix
package ‘Matrix’ was built under R version 3.4.1
Attaching package: ‘Matrix’

The following object is masked from ‘package:tidyr’:

    expand

This dataset covers the period of 2000–2017 and includes 62560 records of fines levied against corporations relating to violations of regulations, from cases initiated by 43 federal regulatory agencies. I downloaded the data from the Good Jobs First “Violation Tracker”, using the search GUI with all the options set to <any>.

The Size of Penalties

This dataset contains fields for both Penalty_Amount and Penalty_Amount_Adjusted_For_Eliminating_Multiple_Counting, but is clear that these adjustments make very little difference to the data as a whole, as these two variables are correlation at r=0.994. I have thus elected to use the adjusted penalty values for all these analyses.

The first pattern to note is that (perhaps predictably) the penalties imposed via criminal proceedings tend to be larger than those imposed via civil proceedings, and larger still when both civil and criminal proceedings have been brought.

The way this pattern is built up is somewhat non-intuitive, as this linear model and boxplot makes clear. The groups mean are well-separated, and easy to distinguish statistically (small p-values), but there is so much variation within groups that the predictive value of the mean differences is small (low R2 value). The vast majority of penalties arise from civil actions – 99.3% of those recorded – and the mean value of these penalties is comparatively small.

summary( lm( Penalty_Adj ~ Civ_Crim_bin, data=viol ) )

Call:
lm(formula = Penalty_Adj ~ Civ_Crim_bin, data = viol)

Residuals:
       Min         1Q     Median         3Q        Max 
-5.913e+08 -4.644e+06 -4.640e+06 -4.627e+06  2.080e+10 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)           596240136   24921654   23.93   <2e-16 ***
Civ_Crim_bincivil    -591589764   24931682  -23.73   <2e-16 ***
Civ_Crim_bincriminal -464209918   26451988  -17.55   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 176200000 on 62557 degrees of freedom
Multiple R-squared:  0.01211,   Adjusted R-squared:  0.01207 
F-statistic: 383.3 on 2 and 62557 DF,  p-value: < 2.2e-16
viol %>% filter( Penalty_Adj > 0 ) %>% ggplot( aes( Civ_Crim_bin, Penalty_Adj )) + 
                                        geom_point( colour="blue", alpha=0.3, position="jitter" ) + 
                                        geom_boxplot( outlier.size=0, alpha=0 ) + 
                                        coord_flip() + 
                                        xlab( "Type of case brought" ) +
                                        scale_y_log10() +
                                        ylab( "Penalty (log10 $'s)" )

Where are Violations Occurring?

Taking a broad-strokes view of the geographical data, we can see that there seems not to be a visually apparent trend in the locations where penalties are levied – this data appears to track pretty well with the locations of population centres, thought here may be more subtle patterns that are not visible at the nation-wide scale.

data( zipcode )
zipcode <- zipcode %>% mutate( zip=factor( zip ), region=substr( zip, 1, 1) )
full_join( viol, zipcode, by=c( "Zip" = "zip" ) ) %>% mutate( Zip=factor( Zip ) ) %>% filter( Civ_Crim_bin=="civil" ) %>% 
    ggplot() + geom_point( aes( x=longitude, y=latitude, col=Year ), cex=.5 ) + 
        theme_bw() + scale_x_continuous(limits = c(-125,-66), breaks = NULL ) + 
        scale_y_continuous(limits = c(25,50), breaks = NULL ) + 
        labs(x=NULL, y=NULL)

However, if we look the number of penalties paid in each state/territory over the course of this 18-yr dataset, we can see that there are many more violations in some states that others, with West Virginia being responsible for 15.22% of all penalties levied.

The bars are colored by the industrial sector of the parent corporation found liable for the penalty – the blue that occupies 93.43% of the West Virginia bar represents corporations classified as “mining and minerals”. It is apparent that WV is unusual in both the number of violations and the number of those violations related to mining.

What are Corporations being Fined For?

Across the 49 industrial sectors represented, it is immediately clear from this barplot the extent to which mining & mineral corporations are over-represented (25.24% of all penalties). It is also clear that the pink areas – indicating ‘workplace safety or health’ violations – comprise the majority of violations in most sectors, but particularly so in mining.

viol %>% filter( Facility_State != "" ) %>% ggplot( aes( reorder( Major_Industry_of_Parent, Major_Industry_of_Parent, function(x)-length(x) ) )) + 
                                              geom_bar( aes( fill=Primary_Offense )) + 
                                              coord_flip() +
                                              theme( axis.text.y=element_text( hjust=0, size=6 ) ) +
                                              ylab( "no. penalties" ) + 
                                              xlab( "" ) + 
                                              theme( legend.position="none" )

summary( lm( Penalty_Adj ~ Ownership_Structure, data=viol ) )

Call:
lm(formula = Penalty_Adj ~ Ownership_Structure, data = viol)

Residuals:
       Min         1Q     Median         3Q        Max 
-2.397e+07 -7.226e+06 -7.218e+06 -6.423e+06  2.079e+10 

Coefficients:
                                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)                         23974093   10234950   2.342   0.0192 *
Ownership_Structureprivately held  -23300191   10350429  -2.251   0.0244 *
Ownership_Structurepublicly traded -16740801   10266208  -1.631   0.1030  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 177300000 on 62557 degrees of freedom
Multiple R-squared:  0.0002778, Adjusted R-squared:  0.0002458 
F-statistic:  8.69 on 2 and 62557 DF,  p-value: 0.0001684
summary( lm( Penalty_Adj ~ Facility_State, data=viol ) )

Call:
lm(formula = Penalty_Adj ~ Facility_State, data = viol)

Residuals:
       Min         1Q     Median         3Q        Max 
-3.370e+07 -1.822e+07 -2.563e+05 -8.214e+04  2.078e+10 

Coefficients:
                                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                               18286776    1272342  14.373  < 2e-16 ***
Facility_StateAlabama                    -18025172    5189958  -3.473 0.000515 ***
Facility_StateAlaska                     -17819948   12040148  -1.480 0.138867    
Facility_StateAmerican Samoa             -17779976  125291812  -0.142 0.887153    
Facility_StateArizona                    -18213383    7523135  -2.421 0.015481 *  
Facility_StateArkansas                   -18157251    9940337  -1.827 0.067761 .  
Facility_StateCalifornia                 -18120373    3613202  -5.015 5.32e-07 ***
Facility_StateColorado                   -18070030    5634389  -3.207 0.001341 ** 
Facility_StateConnecticut                -18120035    8523108  -2.126 0.033508 *  
Facility_StateDelaware                   -17472454   17763650  -0.984 0.325312    
Facility_StateDistrict of Columbia       -18256598   31347170  -0.582 0.560299    
Facility_StateFlorida                    -17985468    6470401  -2.780 0.005443 ** 
Facility_StateGeorgia                    -18224910    6361712  -2.865 0.004174 ** 
Facility_StateGuam                       -18273209   49157427  -0.372 0.710096    
Facility_StateHawaii                     -18222047   17018418  -1.071 0.284297    
Facility_StateIdaho                      -16471900   14522550  -1.134 0.256703    
Facility_StateIllinois                   -17996049    3831115  -4.697 2.64e-06 ***
Facility_StateIndiana                    -17475494    4916420  -3.555 0.000379 ***
Facility_StateIowa                       -18156113    9489436  -1.913 0.055715 .  
Facility_StateKansas                     -18133620    9016436  -2.011 0.044311 *  
Facility_StateKentucky                   -18241583    3200510  -5.700 1.21e-08 ***
Facility_StateLouisiana                  -17578982    8220109  -2.139 0.032477 *  
Facility_StateMaine                      -18257097   15028420  -1.215 0.224432    
Facility_StateMaryland                   -18034588    9165956  -1.968 0.049123 *  
Facility_StateMassachusetts              -17422929    7274225  -2.395 0.016616 *  
Facility_StateMichigan                   -18154328    6821285  -2.661 0.007783 ** 
Facility_StateMinnesota                  -18236304    5908405  -3.087 0.002026 ** 
Facility_StateMississippi                -18055166   10535728  -1.714 0.086587 .  
Facility_StateMissouri                   -18089957    7654616  -2.363 0.018117 *  
Facility_StateMontana                    -18055374   12500535  -1.444 0.148640    
Facility_StateNebraska                   -18198953   11061670  -1.645 0.099928 .  
Facility_StateNevada                     -18031237    5875831  -3.069 0.002151 ** 
Facility_StateNew Hampshire              -18235103   16790237  -1.086 0.277459    
Facility_StateNew Jersey                 -18140599    6309489  -2.875 0.004040 ** 
Facility_StateNew Mexico                 -18158949   10917648  -1.663 0.096264 .  
Facility_StateNew York                   -18108973    5287261  -3.425 0.000615 ***
Facility_StateNorth Carolina             -17502134    6779308  -2.582 0.009834 ** 
Facility_StateNorth Dakota               -18244123   20498538  -0.890 0.373458    
Facility_StateNorthern Mariana Islands   -18265388  177184812  -0.103 0.917895    
Facility_StateOhio                       -16541211    4725096  -3.501 0.000464 ***
Facility_StateOklahoma                   -18148139    9529064  -1.905 0.056849 .  
Facility_StateOregon                     -18184211   14768926  -1.231 0.218235    
Facility_StatePennsylvania               -18108068    4366808  -4.147 3.38e-05 ***
Facility_StatePuerto Rico                -18011010   11368026  -1.584 0.113118    
Facility_StateRhode Island               -17500532   20919620  -0.837 0.402843    
Facility_StateSouth Carolina             -18218457   10208322  -1.785 0.074320 .  
Facility_StateSouth Dakota                -8620063   26443099  -0.326 0.744437    
Facility_StateTennessee                  -18180665    6470401  -2.810 0.004958 ** 
Facility_StateTexas                      -17907249    3610898  -4.959 7.10e-07 ***
Facility_StateUtah                       -18016764    8096628  -2.225 0.026070 *  
Facility_StateVermont                    -18023624   45765432  -0.394 0.693711    
Facility_StateVirgin Islands of the U.S.  15412764   38684828   0.398 0.690323    
Facility_StateVirginia                   -17142463    5158794  -3.323 0.000891 ***
Facility_StateWashington                 -18194236    8358478  -2.177 0.029504 *  
Facility_StateWest Virginia              -18199133    2529098  -7.196 6.27e-13 ***
Facility_StateWisconsin                  -14772491    7555345  -1.955 0.050560 .  
Facility_StateWyoming                    -18171775    9778005  -1.858 0.063112 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 177200000 on 62503 degrees of freedom
Multiple R-squared:  0.002203,  Adjusted R-squared:  0.001309 
F-statistic: 2.464 on 56 and 62503 DF,  p-value: 7.378e-09
summary( lm( Penalty_Adj ~ Year, data=viol[ viol$Civ_Crim_bin=="civil", ] ) )


summary( lmer( Penalty_Adj ~ Year + Civ_Crim_bin + ( Year | Facility_State ), data=viol ) )
LS0tCnRpdGxlOiAiRGF0YSBJbmN1YmF0b3IgQ2hhbGxlbmdlIC0gUXVlc3Rpb24gMzogUHJvamVjdCBwaXRjaCIKYXV0aG9yOiAiV2lsbCBQaXRjaGVycyIKZGF0ZTogIlNhdHVyZGF5LCAyOCBPY3RvYmVyIDIwMTciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIGxvYWQgcGFja2FnZXN9CnJlcXVpcmUoIHRpZHl2ZXJzZSApCnJlcXVpcmUoIGRhdGEudGFibGUgKQpyZXF1aXJlKCBtYXBzICkKcmVxdWlyZSggemlwY29kZSApCnJlcXVpcmUoIGxtZTQgKQpgYGAKClRoaXMgZGF0YXNldCBjb3ZlcnMgdGhlIHBlcmlvZCBvZiAyMDAwLS0yMDE3IGFuZCBpbmNsdWRlcyA2MjU2MCByZWNvcmRzIG9mIGZpbmVzIGxldmllZCBhZ2FpbnN0IGNvcnBvcmF0aW9ucyByZWxhdGluZyB0byB2aW9sYXRpb25zIG9mIHJlZ3VsYXRpb25zLCBmcm9tIGNhc2VzIGluaXRpYXRlZCBieSA0MyBmZWRlcmFsIHJlZ3VsYXRvcnkgYWdlbmNpZXMuIEkgZG93bmxvYWRlZCB0aGUgZGF0YSBmcm9tIHRoZSBHb29kIEpvYnMgRmlyc3QgWyJWaW9sYXRpb24gVHJhY2tlciJdKGh0dHBzOi8vd3d3Lmdvb2Rqb2JzZmlyc3Qub3JnL3Zpb2xhdGlvbi10cmFja2VyKSwgdXNpbmcgdGhlIHNlYXJjaCBHVUkgd2l0aCBhbGwgdGhlIG9wdGlvbnMgc2V0IHRvIGA8YW55PmAuCgoKYGBge3IgcmVhZCBpbiBkYXRhfQp2aW9sIDwtIHRibF9kZiggZnJlYWQoICIvVXNlcnMvd2lsbHBpdGNoZXJzL0RvY3VtZW50cy89Sm9iX0FwcGxpY2F0aW9uc19ldGMvRGF0YV9JbmN1YmF0b3JfMjAxNy92aW9sYXRpb25fdHJhY2tlcl9leHBvcnQuY3N2IiApKQoKbmFtZXMoIHZpb2wgKSA8LSBnc3ViKCAiICIsICJfIiwgbmFtZXMoIHZpb2wgKSkKCnZpb2wgPC0gdmlvbCAlPiUgbXV0YXRlKCBZZWFyPWFzLmludGVnZXIoIFllYXIgKSwgSW5kdXN0cnlfY29kZT1mYWN0b3IoIEluZHVzdHJ5X2luX1JlY29yZCApLCBDaXZfQ3JpbT1mYWN0b3IoIGBDaXZpbC9DcmltaW5hbGAgKSApICU+JQogICAgICAgICAgICAgICAgICBtdXRhdGUoIEhRX1N0YXRlX29mX1BhcmVudD1mYWN0b3IoIEhRX1N0YXRlX29mX1BhcmVudCApLCBIUV9Db3VudHJ5X29mX1BhcmVudD1mYWN0b3IoIEhRX0NvdW50cnlfb2ZfUGFyZW50ICkgKSAlPiUKICAgICAgICAgICAgICAgICAgbXV0YXRlKCBQcmltYXJ5X09mZmVuc2U9ZmFjdG9yKCBQcmltYXJ5X09mZmVuc2UgKSwgUGVuYWx0eV9BbW91bnQ9YXMubnVtZXJpYyggZ3N1YiggIlskLF0iLCAiIiwgUGVuYWx0eV9BbW91bnQgKSApICkgJT4lIAogICAgICAgICAgICAgICAgICBtdXRhdGUoIFBlbmFsdHlfQWRqPWFzLm51bWVyaWMoIGdzdWIoICJbJCxdIiwgIiIsIFBlbmFsdHlfQW1vdW50X0FkanVzdGVkX0Zvcl9FbGltaW5hdGluZ19NdWx0aXBsZV9Db3VudGluZyApKSApICU+JSAKICAgICAgICAgICAgICAgICAgbXV0YXRlKCBTdWJ0cmFjdGlvbl9Gcm9tX1BlbmFsdHk9YXMubnVtZXJpYyggIlskLF0iLCAiIiwgU3VidHJhY3Rpb25fRnJvbV9QZW5hbHR5ICkgKSAlPiUgCiAgICAgICAgICAgICAgICAgIG11dGF0ZSggQWdlbmN5PWZhY3RvciggQWdlbmN5ICksIFNlY29uZGFyeV9PZmZlbnNlPWZhY3RvciggU2Vjb25kYXJ5X09mZmVuc2UgKSwgT3duZXJzaGlwX1N0cnVjdHVyZT1mYWN0b3IoIE93bmVyc2hpcF9TdHJ1Y3R1cmUgKSApICU+JSAKICAgICAgICAgICAgICAgICAgbXV0YXRlKCBNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQ9ZmFjdG9yKCBNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQgKSwgWmlwPWZhY3RvciggWmlwICksIEZhY2lsaXR5X1N0YXRlPWZhY3RvciggRmFjaWxpdHlfU3RhdGUgKSApCgp2aW9sIDwtIHZpb2wgJT4lIG11dGF0ZSggQ2l2X0NyaW1fYmluPWZhY3RvciggaWZlbHNlKCBncmVwbCggImNpdmlsIGFuZCBjcmltaW5hbCIsIGBDaXZpbC9DcmltaW5hbGAgKT09IlRSVUUiLCAiYm90aCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCBncmVwbCggImNpdmlsIiwgYENpdmlsL0NyaW1pbmFsYCApPT0iVFJVRSIsICJjaXZpbCIsICJjcmltaW5hbCIgKSkpKQoKIyBzdHIoIHZpb2wgKQojIHN1bW1hcnkoIHZpb2wkWWVhciApCnZpb2wKYGBgCgojIyBUaGUgU2l6ZSBvZiBQZW5hbHRpZXMKClRoaXMgZGF0YXNldCBjb250YWlucyBmaWVsZHMgZm9yIGJvdGggYFBlbmFsdHlfQW1vdW50YCBhbmQgYFBlbmFsdHlfQW1vdW50X0FkanVzdGVkX0Zvcl9FbGltaW5hdGluZ19NdWx0aXBsZV9Db3VudGluZ2AsIGJ1dCBpcyBjbGVhciB0aGF0IHRoZXNlIGFkanVzdG1lbnRzIG1ha2UgdmVyeSBsaXR0bGUgZGlmZmVyZW5jZSB0byB0aGUgZGF0YSBhcyBhIHdob2xlLCBhcyB0aGVzZSB0d28gdmFyaWFibGVzIGFyZSBjb3JyZWxhdGlvbiBhdCByPWByIHJvdW5kKCBjb3IoIHZpb2wkUGVuYWx0eV9BbW91bnQsIHZpb2wkUGVuYWx0eV9BZGogKSwgMylgLiBJIGhhdmUgdGh1cyBlbGVjdGVkIHRvIHVzZSB0aGUgYWRqdXN0ZWQgcGVuYWx0eSB2YWx1ZXMgZm9yIGFsbCB0aGVzZSBhbmFseXNlcy4KClRoZSBmaXJzdCBwYXR0ZXJuIHRvIG5vdGUgaXMgdGhhdCAocGVyaGFwcyBwcmVkaWN0YWJseSkgdGhlIHBlbmFsdGllcyBpbXBvc2VkIHZpYSAqY3JpbWluYWwqIHByb2NlZWRpbmdzIHRlbmQgdG8gYmUgbGFyZ2VyIHRoYW4gdGhvc2UgaW1wb3NlZCB2aWEgKmNpdmlsKiBwcm9jZWVkaW5ncywgYW5kIGxhcmdlciBzdGlsbCB3aGVuIGJvdGggY2l2aWwgKmFuZCogY3JpbWluYWwgcHJvY2VlZGluZ3MgaGF2ZSBiZWVuIGJyb3VnaHQuCgpgYGB7ciBwZW5hbHR5IGNpdiB2cy4gY3JpbX0KdmlvbCAlPiUgZmlsdGVyKCBQZW5hbHR5X0FkaiA+IDAgKSAlPiUgZ2dwbG90KCBhZXMoIFBlbmFsdHlfQWRqICkpICsgCiAgICAgICAgICBnZW9tX2RlbnNpdHkoIGFlcyggY29sPUNpdl9DcmltX2JpbiwgZmlsbD1DaXZfQ3JpbV9iaW4gKSwgYWxwaGE9LjUgKSArIAogICAgICAgICAgc2NhbGVfeF9sb2cxMCgpICsgCiAgICAgICAgICB4bGFiKCAiUGVuYWx0eSAobG9nMTAgJCdzKSIgKSArIAogICAgICAgICAgc2NhbGVfZmlsbF9kaXNjcmV0ZSggbmFtZT0iVHlwZSBvZlxuY2FzZSBicm91Z2h0IikgKyAKICAgICAgICAgIHNjYWxlX2NvbG91cl9kaXNjcmV0ZSggbmFtZT0iVHlwZSBvZlxuY2FzZSBicm91Z2h0IiApCmBgYAoKVGhlIHdheSB0aGlzIHBhdHRlcm4gaXMgYnVpbHQgdXAgaXMgc29tZXdoYXQgbm9uLWludHVpdGl2ZSwgYXMgdGhpcyBsaW5lYXIgbW9kZWwgYW5kIGJveHBsb3QgbWFrZXMgY2xlYXIuIFRoZSBncm91cHMgbWVhbiBhcmUgd2VsbC1zZXBhcmF0ZWQsIGFuZCBlYXN5IHRvIGRpc3Rpbmd1aXNoIHN0YXRpc3RpY2FsbHkgKHNtYWxsIHAtdmFsdWVzKSwgYnV0IHRoZXJlIGlzIHNvIG11Y2ggdmFyaWF0aW9uIHdpdGhpbiBncm91cHMgdGhhdCB0aGUgcHJlZGljdGl2ZSB2YWx1ZSBvZiB0aGUgbWVhbiBkaWZmZXJlbmNlcyBpcyBzbWFsbCAobG93IFJeMl4gdmFsdWUpLiBUaGUgdmFzdCBtYWpvcml0eSBvZiBwZW5hbHRpZXMgYXJpc2UgZnJvbSBjaXZpbCBhY3Rpb25zIC0tIGByIHJvdW5kKGxlbmd0aCh2aW9sJFBlbmFsdHlfQWRqW3Zpb2wkQ2l2X0NyaW1fYmluPT0iY2l2aWwiXSkvbGVuZ3RoKHZpb2wkUGVuYWx0eV9BZGopKjEwMCwxKWAlIG9mIHRob3NlIHJlY29yZGVkIC0tIGFuZCB0aGUgbWVhbiB2YWx1ZSBvZiB0aGVzZSBwZW5hbHRpZXMgaXMgY29tcGFyYXRpdmVseSBzbWFsbC4KCmBgYHtyIG5vLnMgY3JpbSB2cy4gY2l2LCBmaWcua2VlcD0nbGFzdCd9CnN1bW1hcnkoIGxtKCBQZW5hbHR5X0FkaiB+IENpdl9DcmltX2JpbiwgZGF0YT12aW9sICkgKQoKdmlvbCAlPiUgZmlsdGVyKCBQZW5hbHR5X0FkaiA+IDAgKSAlPiUgZ2dwbG90KCBhZXMoIENpdl9DcmltX2JpbiwgUGVuYWx0eV9BZGogKSkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoIGNvbG91cj0iYmx1ZSIsIGFscGhhPTAuMywgcG9zaXRpb249ImppdHRlciIgKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLnNpemU9MCwgYWxwaGE9MCApICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZF9mbGlwKCkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIoICJUeXBlIG9mIGNhc2UgYnJvdWdodCIgKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2xvZzEwKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiggIlBlbmFsdHkgKGxvZzEwICQncykiICkKYGBgCgojIyBUcmVuZHMgb3ZlciBUaW1lCgpNb2RlbGxpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBlbmFsdHkgdmFsdWVzIGFuZCB0aGUgeWVhciB0aGUgcGVuYWx0eSB3YXMgaW1wb3NlZCByZXZlYWxzIGFuIGluY3JlYXNpbmcgdHJlbmQsIHdpdGggdGhlIGNvZWZmaWNlbnQgZm9yIHllYXIgaW5kaWNhdGluZyBhbiBpbmNyZWFzZSBvZiB+JDk1MGsgcGVyIHllYXIuIEhvd2V2ZXIsIHRoZSBSXjJeIHZhbHVlIGZvciB0aGlzIG1vZGVsIGluZGljYXRlcyB0aGF0IGl0IGFjY291bnRzIGZvciBvbmx5IDAuMDUlIG9mIHRoZSB2YXJpYXRpb24gaW4gdGhlIGRhdGEuIAoKVGhpcyBtYWtlcyBzZW5zZSB3aXRoIHJlZmVyZW5jZSB0byB0aGUgc2NhdHRlciBwbG90LCB3aGVyZSB3ZSBjYW4gc2VlIHRoYXQgdGhlIHRyZW5kIGZvciBhbm51YWwgaW5jcmVhc2UgKHJlcHJlc2VudGVkIGJ5IHRoZSBkYXNoZWQgYmxhY2sgbGluZSkgaXMgcHJldHR5IG1vZGVzdCB3aGVuIGNvbXBhcmVkIHRvICpodWdlKiB2YXJpYXRpb24gaW4gdGhlIHNpemUgb2YgcGVuYWx0aWVzIChub3RlIGxvZ14xMF4gc2NhbGUpLgoKYGBge3IgcGVuYWx0eSBieSB5ZWFyfQpzdW1tYXJ5KCBsbSggUGVuYWx0eV9BZGogfiBZZWFyLCBkYXRhPXZpb2wgKSApCgp2aW9sICU+JSBmaWx0ZXIoIFBlbmFsdHlfQWRqID4gMCApICU+JSBnZ3Bsb3QoIGFlcyggeD1ZZWFyLCB5PVBlbmFsdHlfQWRqICkgKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9qaXR0ZXIoIGFlcyggY29sPUNpdl9DcmltX2JpbiApLCBhbHBoYT0wLjUsIHdpZHRoPS4yLCBoZWlnaHQ9MCApICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIoICJQZW5hbHR5IGFtb3VudCAobG9nMTAgJCdzKSIgKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3Ntb290aCggbWV0aG9kPSJsbSIsIGNvbD0iYmxhY2siLCBsdHk9MiApICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfZGlzY3JldGUoIG5hbWU9IlR5cGUgb2ZcbmNhc2UgYnJvdWdodCIgKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2xvZzEwKCkKYGBgCgojIyBXaGVyZSBhcmUgVmlvbGF0aW9ucyBPY2N1cnJpbmc/CgpUYWtpbmcgYSBicm9hZC1zdHJva2VzIHZpZXcgb2YgdGhlIGdlb2dyYXBoaWNhbCBkYXRhLCB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgc2VlbXMgbm90IHRvIGJlIGEgdmlzdWFsbHkgYXBwYXJlbnQgdHJlbmQgaW4gdGhlIGxvY2F0aW9ucyB3aGVyZSBwZW5hbHRpZXMgYXJlIGxldmllZCAtLSB0aGlzIGRhdGEgYXBwZWFycyB0byB0cmFjayBwcmV0dHkgd2VsbCB3aXRoIHRoZSBsb2NhdGlvbnMgb2YgcG9wdWxhdGlvbiBjZW50cmVzLCB0aG91Z2h0IGhlcmUgbWF5IGJlIG1vcmUgc3VidGxlIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCB2aXNpYmxlIGF0IHRoZSBuYXRpb24td2lkZSBzY2FsZS4KCmBgYHtyIHBlbmFsdHkgbWFwLCB3YXJuaW5nPUZBTFNFfQpkYXRhKCB6aXBjb2RlICkKemlwY29kZSA8LSB6aXBjb2RlICU+JSBtdXRhdGUoIHppcD1mYWN0b3IoIHppcCApLCByZWdpb249c3Vic3RyKCB6aXAsIDEsIDEpICkKCmZ1bGxfam9pbiggdmlvbCwgemlwY29kZSwgYnk9YyggIlppcCIgPSAiemlwIiApICkgJT4lIG11dGF0ZSggWmlwPWZhY3RvciggWmlwICkgKSAlPiUgZmlsdGVyKCBDaXZfQ3JpbV9iaW49PSJjaXZpbCIgKSAlPiUgCiAgICBnZ3Bsb3QoKSArIGdlb21fcG9pbnQoIGFlcyggeD1sb25naXR1ZGUsIHk9bGF0aXR1ZGUsIGNvbD1ZZWFyICksIGNleD0uNSApICsgCiAgICAgICAgdGhlbWVfYncoKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xMjUsLTY2KSwgYnJlYWtzID0gTlVMTCApICsgCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMjUsNTApLCBicmVha3MgPSBOVUxMICkgKyAKICAgICAgICBsYWJzKHg9TlVMTCwgeT1OVUxMKQoKYGBgCgpIb3dldmVyLCBpZiB3ZSBsb29rIHRoZSBudW1iZXIgb2YgcGVuYWx0aWVzIHBhaWQgaW4gZWFjaCBzdGF0ZS90ZXJyaXRvcnkgb3ZlciB0aGUgY291cnNlIG9mIHRoaXMgMTgteXIgZGF0YXNldCwgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSAqbWFueSogbW9yZSB2aW9sYXRpb25zIGluIHNvbWUgc3RhdGVzIHRoYXQgb3RoZXJzLCB3aXRoIFdlc3QgVmlyZ2luaWEgYmVpbmcgcmVzcG9uc2libGUgZm9yIGByIHJvdW5kKG5yb3codmlvbFt2aW9sJEZhY2lsaXR5X1N0YXRlPT0iV2VzdCBWaXJnaW5pYSIsXSkvbnJvdyh2aW9sW3Zpb2wkRmFjaWxpdHlfU3RhdGUhPSIiLF0pKjEwMCwyKWAlIG9mIGFsbCBwZW5hbHRpZXMgbGV2aWVkLiAKCmBgYHtyfQp2aW9sICU+JSBmaWx0ZXIoIEZhY2lsaXR5X1N0YXRlICE9ICIiICkgJT4lIGdncGxvdCggYWVzKCByZW9yZGVyKCBGYWNpbGl0eV9TdGF0ZSwgRmFjaWxpdHlfU3RhdGUsIGZ1bmN0aW9uKHgpLWxlbmd0aCh4KSApICkpICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX2JhciggYWVzKCBmaWxsPU1ham9yX0luZHVzdHJ5X29mX1BhcmVudCApKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRfZmxpcCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoIGhqdXN0PTAsIHNpemU9NiApICkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiggIm5vLiBwZW5hbHRpZXMiICkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIoICIiICkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKCBsZWdlbmQucG9zaXRpb249Im5vbmUiICkKYGBgCgpUaGUgYmFycyBhcmUgY29sb3JlZCBieSB0aGUgaW5kdXN0cmlhbCBzZWN0b3Igb2YgdGhlIHBhcmVudCBjb3Jwb3JhdGlvbiBmb3VuZCBsaWFibGUgZm9yIHRoZSBwZW5hbHR5IC0tIHRoZSBibHVlIHRoYXQgb2NjdXBpZXMgYHIgcm91bmQoIG5yb3codmlvbFt2aW9sJEZhY2lsaXR5X1N0YXRlPT0iV2VzdCBWaXJnaW5pYSImdmlvbCRNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQ9PSJtaW5pbmcgYW5kIG1pbmVyYWxzIixdKSAvIG5yb3codmlvbFt2aW9sJEZhY2lsaXR5X1N0YXRlPT0iV2VzdCBWaXJnaW5pYSIsXSkqMTAwLDIpYCUgb2YgdGhlIFdlc3QgVmlyZ2luaWEgYmFyIHJlcHJlc2VudHMgY29ycG9yYXRpb25zIGNsYXNzaWZpZWQgYXMgIm1pbmluZyBhbmQgbWluZXJhbHMiLiBJdCBpcyBhcHBhcmVudCB0aGF0IFdWIGlzIHVudXN1YWwgaW4gYm90aCB0aGUgbnVtYmVyIG9mIHZpb2xhdGlvbnMgKmFuZCogdGhlIG51bWJlciBvZiB0aG9zZSB2aW9sYXRpb25zIHJlbGF0ZWQgdG8gbWluaW5nLgoKIyMgV2hhdCBhcmUgQ29ycG9yYXRpb25zIGJlaW5nIEZpbmVkIEZvcj8KCkFjcm9zcyB0aGUgNDkgaW5kdXN0cmlhbCBzZWN0b3JzIHJlcHJlc2VudGVkLCBpdCBpcyBpbW1lZGlhdGVseSBjbGVhciBmcm9tIHRoaXMgYmFycGxvdCB0aGUgZXh0ZW50IHRvIHdoaWNoIG1pbmluZyAmIG1pbmVyYWwgY29ycG9yYXRpb25zIGFyZSBvdmVyLXJlcHJlc2VudGVkIChgciByb3VuZCggbnJvdyh2aW9sW3Zpb2wkTWFqb3JfSW5kdXN0cnlfb2ZfUGFyZW50PT0ibWluaW5nIGFuZCBtaW5lcmFscyIsXSkgLyBucm93KHZpb2wpKjEwMCwyKWAlIG9mIGFsbCBwZW5hbHRpZXMpLiBJdCBpcyBhbHNvIGNsZWFyIHRoYXQgdGhlIHBpbmsgYXJlYXMgLS0gaW5kaWNhdGluZyAnd29ya3BsYWNlIHNhZmV0eSBvciBoZWFsdGgnIHZpb2xhdGlvbnMgLS0gY29tcHJpc2UgdGhlIG1ham9yaXR5IG9mIHZpb2xhdGlvbnMgaW4gbW9zdCBzZWN0b3JzLCBidXQgcGFydGljdWxhcmx5IHNvIGluIG1pbmluZy4KCmBgYHtyfQp2aW9sICU+JSBmaWx0ZXIoIEZhY2lsaXR5X1N0YXRlICE9ICIiICkgJT4lIGdncGxvdCggYWVzKCByZW9yZGVyKCBNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQsIE1ham9yX0luZHVzdHJ5X29mX1BhcmVudCwgZnVuY3Rpb24oeCktbGVuZ3RoKHgpICkgKSkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fYmFyKCBhZXMoIGZpbGw9UHJpbWFyeV9PZmZlbnNlICkpICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZF9mbGlwKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dCggaGp1c3Q9MCwgc2l6ZT02ICkgKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGFiKCAibm8uIHBlbmFsdGllcyIgKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiggIiIgKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIgKQpgYGAKCmBgYHtyfQp2aW9sICU+JSBmaWx0ZXIoIEZhY2lsaXR5X1N0YXRlPT0iV2VzdCBWaXJnaW5pYSIgKSAlPiUgZ2dwbG90KCBhZXMoIHJlb3JkZXIoIE1ham9yX0luZHVzdHJ5X29mX1BhcmVudCwgTWFqb3JfSW5kdXN0cnlfb2ZfUGFyZW50LCBmdW5jdGlvbih4KS1sZW5ndGgoeCkpICkpICsgZ2VvbV9iYXIoKSArIGNvb3JkX2ZsaXAoKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeSggdmlvbCRNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQgKQp2aW9sICU+JSBnZ3Bsb3QoIGFlcyggcmVvcmRlciggTWFqb3JfSW5kdXN0cnlfb2ZfUGFyZW50LCBNYWpvcl9JbmR1c3RyeV9vZl9QYXJlbnQsIGZ1bmN0aW9uKHgpLWxlbmd0aCh4KSkgKSkgKyBnZW9tX2JhcigpICsgY29vcmRfZmxpcCgpCmBgYAoKYGBge3J9CnN1bW1hcnkoIHZpb2wkUHJpbWFyeV9PZmZlbnNlICkKdmlvbCAlPiUgZ2dwbG90KCBhZXMoIHJlb3JkZXIoIFByaW1hcnlfT2ZmZW5zZSwgUHJpbWFyeV9PZmZlbnNlLCBmdW5jdGlvbih4KS1sZW5ndGgoeCkpICkpICsgZ2VvbV9iYXIoKSArIGNvb3JkX2ZsaXAoKQpgYGAKIAoKYGBge3J9CnZpb2wgJT4lIGZpbHRlciggUGVuYWx0eV9BZGogPiAwICkgJT4lIGdncGxvdCggYWVzKCBQZW5hbHR5X0FkaiApKSArIGdlb21fZGVuc2l0eSggYWVzKCBjb2w9T3duZXJzaGlwX1N0cnVjdHVyZSwgZmlsbD1Pd25lcnNoaXBfU3RydWN0dXJlICksIGFscGhhPS41ICkgKyBzY2FsZV94X2xvZzEwKCkKCnN1bW1hcnkoIGxtKCBQZW5hbHR5X0FkaiB+IE93bmVyc2hpcF9TdHJ1Y3R1cmUsIGRhdGE9dmlvbCApICkKYGBgCgoKYGBge3J9CnZpb2wgJT4lIGZpbHRlciggRmFjaWxpdHlfU3RhdGUgIT0gIiIgKSAlPiUgY291bnQoIFByaW1hcnlfT2ZmZW5zZSwgRmFjaWxpdHlfU3RhdGUgKSAlPiUgYXJyYW5nZSggLW4gKSAKdmlvbCAlPiUgZmlsdGVyKCBGYWNpbGl0eV9TdGF0ZSAhPSAiIiApICU+JSBjb3VudCggRmFjaWxpdHlfU3RhdGUsIE1ham9yX0luZHVzdHJ5X29mX1BhcmVudCApICU+JSBhcnJhbmdlKCAtbiApIAoKdmlvbCAlPiUgZmlsdGVyKCBGYWNpbGl0eV9TdGF0ZSAhPSAiIiApICU+JSBjb3VudCggRmFjaWxpdHlfU3RhdGUsIFByaW1hcnlfT2ZmZW5zZSwgTWFqb3JfSW5kdXN0cnlfb2ZfUGFyZW50ICkgJT4lIGFycmFuZ2UoIC1uICkgCgp2aW9sICU+JSBmaWx0ZXIoIEZhY2lsaXR5X1N0YXRlICE9ICIiICkgJT4lIGNvdW50KCBQcmltYXJ5X09mZmVuc2UsIEZhY2lsaXR5X1N0YXRlICkgJT4lIGFycmFuZ2UoIC1uICkgJT4lIAogICAgICAgIGdncGxvdCggYWVzKCBQcmltYXJ5X09mZmVuc2UsIEZhY2lsaXR5X1N0YXRlICkgKSArIGdlb21fdGlsZSggYWVzKCBmaWxsPW4gKSwgY29sPSJ3aGl0ZSIgKSArIAogICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudCggbG93ID0gIndoaXRlIiwgaGlnaCA9ICJzdGVlbGJsdWUiICkgKyB0aGVtZV9taW5pbWFsKCkgKyAKICAgICAgICAgICAgdGhlbWUoIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KCBhbmdsZT0zMzAsIGhqdXN0PTAsIHNpemU9OCApLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoIGhqdXN0PTAsIHNpemU9NiApICkKCnZpb2wgJT4lIGZpbHRlciggRmFjaWxpdHlfU3RhdGUgIT0gIiIgKSAlPiUgY291bnQoIE1ham9yX0luZHVzdHJ5X29mX1BhcmVudCwgRmFjaWxpdHlfU3RhdGUgKSAlPiUgYXJyYW5nZSggLW4gKSAKYGBgCgpgYGB7cn0Kc3VtbWFyeSggbG0oIFBlbmFsdHlfQWRqIH4gWWVhciAgKyBQcmltYXJ5X09mZmVuc2UgKyBGYWNpbGl0eV9TdGF0ZSwgZGF0YT12aW9sICkgKQpgYGAKCgoKCmBgYHtyfQpzdW1tYXJ5KCBsbSggUGVuYWx0eV9BZGogfiBZZWFyLCBkYXRhPXZpb2xbIHZpb2wkQ2l2X0NyaW1fYmluPT0iY2l2aWwiLCBdICkgKQoKCnN1bW1hcnkoIGxtZXIoIFBlbmFsdHlfQWRqIH4gWWVhciArIENpdl9DcmltX2JpbiArICggWWVhciB8IEZhY2lsaXR5X1N0YXRlICksIGRhdGE9dmlvbCApICkKYGBgCg==